﻿#pragma once

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <stdbool.h>
#include <time.h>

#define WALL L'■'  //墙的形状
#define FOOD L'▲'  //食物的形状
#define BODY L'●'  // 蛇身的形状

//蛇出现在地图中的位置
#define POS_X 20
#define POS_Y 15

//设置蛇开始的结点数
#define INITSnakeBody 2

#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)

enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};

enum GAME_STATUS
{
	OK=1,//正常运⾏
	KILL_BY_WALL,//撞墙
	KILL_BY_SELF,//咬到⾃⼰
	END_ESC//正常结束
};

typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode,*pSnakeNode;

typedef struct Snake
{
	pSnakeNode _pSnake;//维护整条蛇的指针,指向蛇头
	pSnakeNode _pFood;//维护⻝物的指针
	enum DIRECTION _Dir;//蛇头的⽅向默认是向右
	enum GAME_STATUS _Status;//游戏状态
	int _Socre;//当前获得分数
	int _foodWeight;//默认每个⻝物10分
	int _SleepTime;//每⾛⼀步休眠时间,休眠的时间越短，蛇的速度就越快反之成立
}Snake, *pSnake;


//定位控制台位置
void setpos(short x, short y);

//打印界面欢迎信息
void welcome();

//打印出游戏地图
void CreatMap();

//创建食物
void CreatFood(pSnake ps);

//初始化蛇的所有信息
void INITSNAKE(pSnake ps);

//设计游戏开始界面
void GameStar(pSnake ps);

//打印出自身的信息
void SnakeFrint();

//空格进行暂停
void pause();

//吃掉食物的走法
void EatFood(pSnakeNode pNextNode, pSnake ps);

//没有吃食物的走法
void NoFood(pSnakeNode pNextNode, pSnake ps);

//维护是不是撞墙了
int KillByWall(pSnake ps);

//维护是不是撞上自己
int KillBySelf(pSnake ps);

//蛇身的移动
void SnakeMove(pSnake ps);

//设计游戏运行界面
void GameRun(pSnake ps);

//设计游戏结束界面
void GameEed(pSnake ps);